#include "Canvas.h"
#include <iostream>
Canvas::Canvas() {
}

Canvas::~Canvas() {
}

void Canvas::agregarVista(Vista* v) {

	mutex.lock();
	vistas.push_back(v);
	v->setCanvas(this);
	mutex.unlock();
	add_events(Gdk::BUTTON_PRESS_MASK);

}

void Canvas::Start(){
	estado = true;
	this->start();
}

void Canvas::Stop() {
	estado = false;
	this->stop();
}

void Canvas::ejecutar() {
	// Hace que se vuelva a dibujar todo

	while (estado){
		mutex.lock();
		
			Glib::RefPtr<Gdk::Window> win = get_window();
			if (win) {
				Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height());
				win->invalidate_rect(r, false);
			}
		mutex.unlock();
		usleep(30000);
	}
	
}
bool Canvas::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) {
	mutex.lock();
	Gtk::Allocation allocation = get_allocation();
	list<Vista*>::iterator it;
	for ( it=vistas.begin() ; it != vistas.end(); it++ ) ((Vista*)(*it))->draw(cr,allocation);
	mutex.unlock();
	return true;
}

void Canvas::quitarVista(short id) { 
	list<Vista*>::iterator it;
	mutex.lock();
	for ( it=vistas.begin() ; it != vistas.end() && (((Vista*)(*it))->getId() != id) ; it++ ){ }
	if (((Vista*)(*it))->getId() == id){ 
		vistas.erase(it);
	}
	
	mutex.unlock();
}

bool Canvas::on_button_press_event(GdkEventButton *event) {
	Gtk::Allocation allocation = get_allocation();
	const int height = allocation.get_height();
	Punto *p = new Punto(event->x, height - event->y);
	eventoClick.emit(p);
	
    return true;
}
